﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Web;
using ExtEasy.Base;
using System.Collections;


namespace ExtEasy
{
    //public class ExtRoot<T> where T: ExtModel,new()
    //{
    //    /// <summary>
    //    /// Набор шаблонов
    //    /// </summary>
    //    public static Templates Templates = new Templates();

    //    /// <summary>
    //    /// Набор объектных моделей пользователей
    //    /// </summary>
    //    public static  ExtModelsList<T> Items = new ExtModelsList<T>();


    //    public static List<MGEMessage> Messages = new List<MGEMessage>();

    //    public static DateTime GetFileDate(string path)
    //    {
    //        return Directory.GetLastWriteTime(HttpContext.Current.Request.PhysicalApplicationPath+path);
    //    }

        
    //}

    public class ExtRoot
    {
        /// <summary>
        /// Набор шаблонов
        /// </summary>
        public static Templates Templates = new Templates();

        /// <summary>
        /// Набор объектных моделей пользователей
        /// </summary>
        //public static ExtModelsList Items = new ExtModelsList();
        public static Hashtable ModelsList = new Hashtable(10000);


        public static List<MGEMessage> Messages = new List<MGEMessage>();

        public static DateTime GetFileDate(string path)
        {
            return Directory.GetLastWriteTime(HttpContext.Current.Request.PhysicalApplicationPath + path);
        }

        public static TimeSpan ModelTimeOut = new TimeSpan(24, 0, 0);

        public static void CollectGarbage()
        {
            List<string> KeysToDelete = new List<string>();
            foreach (string key in ModelsList)
            {
                if (((ExtModel)ModelsList[key]).Date.Subtract(ModelTimeOut).CompareTo(DateTime.Now) < 0) KeysToDelete.Add(key);
            }
            foreach (string key in KeysToDelete)
            {
                ((ExtModel)ModelsList[key]).Dispose();
                ModelsList.Remove(ModelsList[key]);
            }
        }
    }


    public class MGEMessage
    {
        public string Text;
        public string From;
        public DateTime Date;
        public string Color;
    }

    /// <summary>
    /// Список моделек
    /// </summary>
    /// 
    public class ExtModelsList : List<ExtModel>      
    {

        public ExtModel GetByID(string ID)
        //where T : ExtModel
        {
            //ExtModel p = null;
            // ExtModel p = null;
            ExtModel p = null;

            for (int i = 0; i < this.Count; i++)
            {
                if (this[i].ID == ID) { p = this[i]; break; }
            }

            
            return p;
        }
    }
    //public class ExtModelsList<T> : List<T> 
    //    where T: ExtModel, new()
    //{
    //    //public ExtModel GetByID(string ID)
    //    //{
    //    //    ExtModel p = null;
    //    //    for (int i = 0; i < this.Count; i++)
    //    //    {
    //    //        if (this[i].ID == ID) { p = this[i]; break; }
    //    //    }

    //    //    if (p == null)
    //    //    {
    //    //        p = new ExtModel(ID);
    //    //        //p.ID = ID;
    //    //        this.Add(p);
    //    //    }
    //    //    p.RefreshDate();
    //    //    return p;
    //    //}

    //    public T GetByID(string ID) 
    //        //where T : ExtModel
    //    {
    //        //ExtModel p = null;
    //       // ExtModel p = null;
    //        T p = null;
            
    //        for (int i = 0; i < this.Count; i++)
    //        {
    //            if (this[i].ID == ID) { p = this[i]; break; }
    //        }

    //        if (p == null)
    //        {
    //            p = new T();
    //            p.Init(ID);
    //            this.Add(p);
    //        }
    //        p.RefreshDate();
    //        return p;
    //    }
    //}

    /// <summary>
    /// Класс шаблона
    /// </summary>
    public class Template
    {
        public string Name;
        public string Body;
    }

    /// <summary>
    /// Список шаблонов
    /// </summary>
    public class Templates : List<Template>
    {
        public Templates()
        {
            //string path = HttpContext.Current.Request.PhysicalApplicationPath + "bin/Templates";

            //string[] files = Directory.GetFiles(path, "*.tmpl");

            //for (int i = 0; i < files.Length; i++ )
            //{
            //    StreamReader sr = File.OpenText(files[i]);
            //    Template t = new Template();
            //    t.Name = (new FileInfo(files[i])).Name.Replace(".tmpl", "");
            //    t.Body = sr.ReadToEnd();
            //    this.Add(t);

            //}
        }

        public string GetTemplate(string key)
        {
            for (int i = 0; i < this.Count; i++)
            {
                if (this[i].Name == key) { return this[i].Body; }
            }
            return "";
        }
    }

}
